home *** CD-ROM | disk | FTP | other *** search
- /*
- * tclUnixPort.h --
- *
- * This header file handles porting issues that occur because
- * of differences between systems. It reads in UNIX-related
- * header files and sets up UNIX-related macros for Tcl's UNIX
- * core. It should be the only file that contains #ifdefs to
- * handle different flavors of UNIX. This file sets up the
- * union of all UNIX-related things needed by any of the Tcl
- * core files. This file depends on configuration #defines such
- * as NO_DIRENT_H that are set up by the "configure" script.
- *
- * Much of the material in this file was originally contributed
- * by Karl Lehenbauer, Mark Diekhans and Peter da Silva.
- *
- * Copyright (c) 1991-1994 The Regents of the University of California.
- * Copyright (c) 1994-1995 Sun Microsystems, Inc.
- *
- * See the file "license.terms" for information on usage and redistribution
- * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
- *
- * SCCS: @(#) tclUnixPort.h 1.33 96/03/25 17:15:21
- */
-
- #ifndef _TCLUNIXPORT
- #define _TCLUNIXPORT
-
- #ifndef _TCLINT
- # include "tclInt.h"
- #endif
- #include <errno.h>
- #include <fcntl.h>
- #ifdef HAVE_NET_ERRNO_H
- # include <net/errno.h>
- #endif
- #include <pwd.h>
- #include <signal.h>
- #include <sys/param.h>
- #include <sys/types.h>
- #ifdef USE_DIRENT2_H
- # include "../compat/dirent2.h"
- #else
- # ifdef NO_DIRENT_H
- # include "../compat/dirent.h"
- # else
- # include <dirent.h>
- # endif
- #endif
- #include <sys/file.h>
- #ifdef HAVE_SYS_SELECT_H
- # include <sys/select.h>
- #endif
- #include <sys/stat.h>
- #if TIME_WITH_SYS_TIME
- # include <sys/time.h>
- # include <time.h>
- #else
- # if HAVE_SYS_TIME_H
- # include <sys/time.h>
- # else
- # include <time.h>
- # endif
- #endif
- #ifndef NO_SYS_WAIT_H
- # include <sys/wait.h>
- #endif
- #ifdef HAVE_UNISTD_H
- # include <unistd.h>
- #else
- # include "../compat/unistd.h"
- #endif
-
- /*
- * Socket support stuff: This likely needs more work to parameterize for
- * each system.
- */
-
- #include <sys/socket.h> /* struct sockaddr, SOCK_STREAM, ... */
- #include <sys/utsname.h> /* uname system call. */
- #include <netinet/in.h> /* struct in_addr, struct sockaddr_in */
- #include <arpa/inet.h> /* inet_ntoa() */
- #include <netdb.h> /* gethostbyname() */
-
- /*
- * NeXT doesn't define O_NONBLOCK, so #define it here if necessary.
- */
-
- #ifndef O_NONBLOCK
- # define O_NONBLOCK 0x80
- #endif
-
- /*
- * HPUX needs the flag O_NONBLOCK to get the right non-blocking I/O
- * semantics, while most other systems need O_NDELAY. Define the
- * constant NBIO_FLAG to be one of these
- */
-
- #ifdef HPUX
- # define NBIO_FLAG O_NONBLOCK
- #else
- # define NBIO_FLAG O_NDELAY
- #endif
-
- /*
- * The default platform eol translation on Unix is TCL_TRANSLATE_LF:
- */
-
- #define TCL_PLATFORM_TRANSLATION TCL_TRANSLATE_LF
-
- /*
- * Not all systems declare the errno variable in errno.h. so this
- * file does it explicitly. The list of system error messages also
- * isn't generally declared in a header file anywhere.
- */
-
- extern int errno;
-
- /*
- * The type of the status returned by wait varies from UNIX system
- * to UNIX system. The macro below defines it:
- */
-
- #ifdef _AIX
- # define WAIT_STATUS_TYPE pid_t
- #else
- #ifndef NO_UNION_WAIT
- # define WAIT_STATUS_TYPE union wait
- #else
- # define WAIT_STATUS_TYPE int
- #endif
- #endif
-
- /*
- * Supply definitions for macros to query wait status, if not already
- * defined in header files above.
- */
-
- #ifndef WIFEXITED
- # define WIFEXITED(stat) (((*((int *) &(stat))) & 0xff) == 0)
- #endif
-
- #ifndef WEXITSTATUS
- # define WEXITSTATUS(stat) (((*((int *) &(stat))) >> 8) & 0xff)
- #endif
-
- #ifndef WIFSIGNALED
- # define WIFSIGNALED(stat) (((*((int *) &(stat)))) && ((*((int *) &(stat))) == ((*((int *) &(stat))) & 0x00ff)))
- #endif
-
- #ifndef WTERMSIG
- # define WTERMSIG(stat) ((*((int *) &(stat))) & 0x7f)
- #endif
-
- #ifndef WIFSTOPPED
- # define WIFSTOPPED(stat) (((*((int *) &(stat))) & 0xff) == 0177)
- #endif
-
- #ifndef WSTOPSIG
- # define WSTOPSIG(stat) (((*((int *) &(stat))) >> 8) & 0xff)
- #endif
-
- /*
- * Define constants for waitpid() system call if they aren't defined
- * by a system header file.
- */
-
- #ifndef WNOHANG
- # define WNOHANG 1
- #endif
- #ifndef WUNTRACED
- # define WUNTRACED 2
- #endif
-
- /*
- * Supply macros for seek offsets, if they're not already provided by
- * an include file.
- */
-
- #ifndef SEEK_SET
- # define SEEK_SET 0
- #endif
-
- #ifndef SEEK_CUR
- # define SEEK_CUR 1
- #endif
-
- #ifndef SEEK_END
- # define SEEK_END 2
- #endif
-
- /*
- * The stuff below is needed by the "time" command. If this
- * system has no gettimeofday call, then must use times and the
- * CLK_TCK #define (from sys/param.h) to compute elapsed time.
- * Unfortunately, some systems only have HZ and no CLK_TCK, and
- * some might not even have HZ.
- */
-
- #ifdef NO_GETTOD
- # include <sys/times.h>
- # include <sys/param.h>
- # ifndef CLK_TCK
- # ifdef HZ
- # define CLK_TCK HZ
- # else
- # define CLK_TCK 60
- # endif
- # endif
- #else
- # ifdef HAVE_BSDGETTIMEOFDAY
- # define gettimeofday BSDgettimeofday
- # endif
- #endif
-
- #ifdef GETTOD_NOT_DECLARED
- EXTERN int gettimeofday _ANSI_ARGS_((struct timeval *tp,
- struct timezone *tzp));
- #endif
-
- /*
- * Define access mode constants if they aren't already defined.
- */
-
- #ifndef F_OK
- # define F_OK 00
- #endif
- #ifndef X_OK
- # define X_OK 01
- #endif
- #ifndef W_OK
- # define W_OK 02
- #endif
- #ifndef R_OK
- # define R_OK 04
- #endif
-
- /*
- * Define FD_CLOEEXEC (the close-on-exec flag bit) if it isn't
- * already defined.
- */
-
- #ifndef FD_CLOEXEC
- # define FD_CLOEXEC 1
- #endif
-
- /*
- * On systems without symbolic links (i.e. S_IFLNK isn't defined)
- * define "lstat" to use "stat" instead.
- */
-
- #ifndef S_IFLNK
- # define lstat stat
- #endif
-
- /*
- * Define macros to query file type bits, if they're not already
- * defined.
- */
-
- #ifndef S_ISREG
- # ifdef S_IFREG
- # define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
- # else
- # define S_ISREG(m) 0
- # endif
- # endif
- #ifndef S_ISDIR
- # ifdef S_IFDIR
- # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
- # else
- # define S_ISDIR(m) 0
- # endif
- # endif
- #ifndef S_ISCHR
- # ifdef S_IFCHR
- # define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR)
- # else
- # define S_ISCHR(m) 0
- # endif
- # endif
- #ifndef S_ISBLK
- # ifdef S_IFBLK
- # define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK)
- # else
- # define S_ISBLK(m) 0
- # endif
- # endif
- #ifndef S_ISFIFO
- # ifdef S_IFIFO
- # define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO)
- # else
- # define S_ISFIFO(m) 0
- # endif
- # endif
- #ifndef S_ISLNK
- # ifdef S_IFLNK
- # define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
- # else
- # define S_ISLNK(m) 0
- # endif
- # endif
- #ifndef S_ISSOCK
- # ifdef S_IFSOCK
- # define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK)
- # else
- # define S_ISSOCK(m) 0
- # endif
- # endif
-
- /*
- * Make sure that MAXPATHLEN is defined.
- */
-
- #ifndef MAXPATHLEN
- # ifdef PATH_MAX
- # define MAXPATHLEN PATH_MAX
- # else
- # define MAXPATHLEN 2048
- # endif
- #endif
-
- /*
- * Make sure that L_tmpnam is defined.
- */
-
- #ifndef L_tmpnam
- # define L_tmpnam 100
- #endif
-
- /*
- * The following macro defines the type of the mask arguments to
- * select:
- */
-
- #ifndef NO_FD_SET
- # define SELECT_MASK fd_set
- #else
- # ifndef _AIX
- typedef long fd_mask;
- # endif
- # if defined(_IBMR2)
- # define SELECT_MASK void
- # else
- # define SELECT_MASK int
- # endif
- #endif
-
- /*
- * Define "NBBY" (number of bits per byte) if it's not already defined.
- */
-
- #ifndef NBBY
- # define NBBY 8
- #endif
-
- /*
- * The following macro defines the number of fd_masks in an fd_set:
- */
-
- #ifndef FD_SETSIZE
- # ifdef OPEN_MAX
- # define FD_SETSIZE OPEN_MAX
- # else
- # define FD_SETSIZE 256
- # endif
- #endif
- #if !defined(howmany)
- # define howmany(x, y) (((x)+((y)-1))/(y))
- #endif
- #ifndef NFDBITS
- # define NFDBITS NBBY*sizeof(fd_mask)
- #endif
- #define MASK_SIZE howmany(FD_SETSIZE, NFDBITS)
-
- /*
- * The following function is declared in tclInt.h but doesn't do anything
- * on Unix systems.
- */
-
- #define TclSetSystemEnv(a,b)
-
- /*
- * The following implements the Unix method for exiting the process.
- */
- #define TclPlatformExit(status) exit(status)
-
- /*
- * The following functions always succeeds under Unix.
- */
-
- #define TclHasSockets(interp) (TCL_OK)
- #define TclHasPipes() (1)
-
- /*
- * Variables provided by the C library:
- */
-
- #if defined(_sgi) || defined(__sgi)
- #define environ _environ
- #endif
- extern char **environ;
-
- /*
- * At present (12/91) not all stdlib.h implementations declare strtod.
- * The declaration below is here to ensure that it's declared, so that
- * the compiler won't take the default approach of assuming it returns
- * an int. There's no ANSI prototype for it because there would end
- * up being too many conflicts with slightly-different prototypes.
- */
-
- extern double strtod();
-
- #endif /* _TCLUNIXPORT */
-